home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 May: Tool Chest / Dev.CD May 97 TC.toast / Sample Code / Snippets / Files / DeleteDirectory / deldir.c
Encoding:
C/C++ Source or Header  |  1992-07-15  |  2.4 KB  |  86 lines  |  [TEXT/KAHL]

  1. #include "deldir.h"
  2.  
  3. /* macros to check to see if parameter block points to a file or to a directory */
  4.  
  5. #define ISDIRECTORY(pb)    ((pb.dirInfo.ioFlAttrib & 0x10) != 0)
  6. #define ISFILE(pb)         ((pb.dirInfo.ioFlAttrib & 0x10) == 0)
  7.  
  8.  
  9. /* DeleteDirectory will delete a subdirectory from a Mac volume,
  10.    including any nested directories.  It should work in AppleShare
  11.    as well as normal envirionments.  It takes the volume reference
  12.    number and the directory ID of the directory to delete. */
  13.    
  14. OSErr DeleteDirectory(short vRefNum,long dirID)
  15. {
  16.     CInfoPBRec pBlock;        /* parameter block used to access files */
  17.     Str255 fName;            /* filename storage */
  18.     OSErr err;                /* error check var */
  19.     short numFiles,index;    /* number of files/index to files */
  20.     
  21.     /* set-up paramter block to get # of files/folders */
  22.     
  23.     pBlock.dirInfo.ioVRefNum = vRefNum;
  24.     pBlock.dirInfo.ioDrDirID = dirID;
  25.     pBlock.dirInfo.ioNamePtr = fName;
  26.     pBlock.dirInfo.ioFDirIndex = -1;    /* get directory id of parent */
  27.     
  28.     /* get number of files/folders in root to remove */
  29.     
  30.     err = PBGetCatInfo(&pBlock,false);
  31.     if (err!=noErr)
  32.         return err;
  33.     
  34.     numFiles = pBlock.dirInfo.ioDrNmFls;
  35.     
  36.     /* index through files/folders, removing them */
  37.     
  38.     index = 1;
  39.     while (index <= numFiles) {
  40.         pBlock.dirInfo.ioDrDirID = dirID;
  41.         pBlock.dirInfo.ioFDirIndex = index;
  42.         err = PBGetCatInfo(&pBlock,false);
  43.         if (err==noErr) {
  44.             if ISDIRECTORY(pBlock)
  45.                 err = DeleteDirectory(vRefNum, pBlock.dirInfo.ioDrDirID);
  46.             else
  47.                 err = DeleteFile(vRefNum,dirID,pBlock.dirInfo.ioNamePtr);
  48.         }
  49.         if (err==noErr)
  50.             numFiles--;        /* decrement # of files if delete successful */
  51.         else
  52.             index++;        /* increment file index if delete failed */
  53.     }
  54.     
  55.     /* delete top directory of tree */
  56.     
  57.     pBlock.dirInfo.ioFDirIndex = -1;
  58.     pBlock.dirInfo.ioDrDirID = dirID;
  59.     err = PBGetCatInfo(&pBlock,false);
  60.     if (err!=noErr)
  61.         return err;
  62.     pBlock.dirInfo.ioDrDirID = pBlock.dirInfo.ioDrParID;
  63.     
  64.     err = PBHDelete(&pBlock,false);
  65.     return err;
  66. }
  67.  
  68.  
  69. /* DeleteFile is called by the above to erase a single file.
  70.    It takes the volume reference number, directory ID, and
  71.    filename of the file to delete.  The result of the
  72.    delete is returned as the function result. */
  73.    
  74. OSErr DeleteFile(short vRefNum,long dirID,StringPtr fName)
  75. {
  76.     HParamBlockRec pBlock;
  77.     OSErr err;
  78.     
  79.     pBlock.ioParam.ioVRefNum = vRefNum;
  80.     pBlock.ioParam.ioNamePtr = fName;
  81.     pBlock.fileParam.ioDirID = dirID;
  82.     
  83.     err = PBHDelete(&pBlock,false);
  84.     
  85.     return err;
  86. }